/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * File Name          : freertos.c
 * Description        : Code for freertos applications
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2025 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "../../User/button.h"
#include "../../User/my_define.h"
#include "../../User/pwm8_cfg.h"
#include "../Inc/tim.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */

/* USER CODE END Variables */
osThreadId defaultTaskHandle;
osThreadId button_tHandle;
uint32_t button_tBuffer[ 128 ];
osStaticThreadDef_t button_tControlBlock;
osThreadId pwm8_tHandle;
uint32_t pwm8_tBuffer[ 128 ];
osStaticThreadDef_t pwm8_tControlBlock;

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */

/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void const * argument);
void button(void const * argument);
void pwm8(void const * argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );

/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];

void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
                                   StackType_t **ppxIdleTaskStackBuffer,
                                   uint32_t *pulIdleTaskStackSize) {
  *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
  *ppxIdleTaskStackBuffer = &xIdleStack[0];
  *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
  /* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* definition and creation of button_t */
  osThreadStaticDef(button_t, button, osPriorityRealtime, 0, 128, button_tBuffer, &button_tControlBlock);
  button_tHandle = osThreadCreate(osThread(button_t), NULL);

  /* definition and creation of pwm8_t */
  osThreadStaticDef(pwm8_t, pwm8, osPriorityRealtime, 0, 128, pwm8_tBuffer, &pwm8_tControlBlock);
  pwm8_tHandle = osThreadCreate(osThread(pwm8_t), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
 * @brief  Function implementing the defaultTask thread.
 * @param  argument: Not used
 * @retval None
 */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for (;;) {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_button */
/**
 * @brief Function implementing the button_t thread.
 * @param argument: Not used
 * @retval None
 */
/* USER CODE END Header_button */
void button(void const * argument)
{
  /* USER CODE BEGIN button */
  Button_Attach_ini();
  /* Infinite loop */
  for (;;) {
    Button_Process();
    osDelay(pdMS_TO_TICKS(20));
  }
  /* USER CODE END button */
}

/* USER CODE BEGIN Header_pwm8 */
/**
 * @brief Function implementing the pwm8_t thread.
 * @param argument: Not used
 * @retval None
 */
/* USER CODE END Header_pwm8 */
void pwm8(void const * argument)
{
  /* USER CODE BEGIN pwm8 */
  /* Infinite loop */
  for (;;) {
    static machine_t machine_store = {0};
    if (machine_store.pwm1_freq != machine.pwm1_freq) {
      set_pwm8_cfg(PWM1_FLAG);
      machine_store.pwm1_freq = machine.pwm1_freq;
      machine_store.pwm1_duty = machine.pwm1_duty;
      machine_store.pwm2_freq = machine.pwm1_freq;
      machine_store.pwm3_freq = machine.pwm1_freq;
      machine_store.pwm4_freq = machine.pwm1_freq;
    } else if (machine_store.pwm2_freq != machine.pwm2_freq) {
      set_pwm8_cfg(PWM2_FLAG);
      machine_store.pwm2_freq = machine.pwm2_freq;
      machine_store.pwm2_duty = machine.pwm2_duty;
      machine_store.pwm1_freq = machine.pwm2_freq;
      machine_store.pwm3_freq = machine.pwm2_freq;
      machine_store.pwm4_freq = machine.pwm2_freq;
    } else if (machine_store.pwm3_freq != machine.pwm3_freq) {
      set_pwm8_cfg(PWM3_FLAG);
      machine_store.pwm3_freq = machine.pwm3_freq;
      machine_store.pwm3_duty = machine.pwm3_duty;
      machine_store.pwm1_freq = machine.pwm3_freq;
      machine_store.pwm2_freq = machine.pwm3_freq;
      machine_store.pwm4_freq = machine.pwm3_freq;
    } else if (machine_store.pwm4_freq != machine.pwm4_freq) {
      set_pwm8_cfg(PWM4_FLAG);
      machine_store.pwm4_freq = machine.pwm4_freq;
      machine_store.pwm4_duty = machine.pwm4_duty;
      machine_store.pwm1_freq = machine.pwm4_freq;
      machine_store.pwm2_freq = machine.pwm4_freq;
      machine_store.pwm3_freq = machine.pwm4_freq;
    } else if (machine_store.pwm5_freq != machine.pwm5_freq) {
      set_pwm8_cfg(PWM5_FLAG);
      machine_store.pwm5_freq = machine.pwm5_freq;
      machine_store.pwm5_duty = machine.pwm5_duty;
      machine_store.pwm6_freq = machine.pwm5_freq;
      machine_store.pwm7_freq = machine.pwm5_freq; 
      machine_store.pwm8_freq = machine.pwm5_freq;
    } else if (machine_store.pwm6_freq != machine.pwm6_freq) {
      set_pwm8_cfg(PWM6_FLAG);
      machine_store.pwm6_freq = machine.pwm6_freq;
      machine_store.pwm6_duty = machine.pwm6_duty;
      machine_store.pwm5_freq = machine.pwm6_freq;
      machine_store.pwm7_freq = machine.pwm6_freq;
      machine_store.pwm8_freq = machine.pwm6_freq;
    }
    else if (machine_store.pwm7_freq != machine.pwm7_freq) {
      set_pwm8_cfg(PWM7_FLAG);
      machine_store.pwm7_freq = machine.pwm7_freq;
      machine_store.pwm7_duty = machine.pwm7_duty;
      machine_store.pwm5_freq = machine.pwm7_freq;
      machine_store.pwm6_freq = machine.pwm7_freq;
      machine_store.pwm8_freq = machine.pwm7_freq;
    }
    else if (machine_store.pwm8_freq != machine.pwm8_freq) {
      set_pwm8_cfg(PWM8_FLAG);
      machine_store.pwm8_freq = machine.pwm8_freq;
      machine_store.pwm8_duty = machine.pwm8_duty;
      machine_store.pwm5_freq = machine.pwm8_freq;
      machine_store.pwm6_freq = machine.pwm8_freq;
      machine_store.pwm7_freq = machine.pwm8_freq;
    }
    else if(machine_store.pwm1_duty != machine.pwm1_duty) {
      set_pwm8_cfg(PWM1_FLAG);
      machine_store.pwm1_duty = machine.pwm1_duty;
    }
    else if(machine_store.pwm2_duty != machine.pwm2_duty) {
      set_pwm8_cfg(PWM2_FLAG);
      machine_store.pwm2_duty = machine.pwm2_duty;
    }
    else if(machine_store.pwm3_duty != machine.pwm3_duty) {
      set_pwm8_cfg(PWM3_FLAG);
      machine_store.pwm3_duty = machine.pwm3_duty;
    }
    else if(machine_store.pwm4_duty != machine.pwm4_duty) {
      set_pwm8_cfg(PWM4_FLAG);
      machine_store.pwm4_duty = machine.pwm4_duty;
    }
    else if(machine_store.pwm5_duty != machine.pwm5_duty) {
      set_pwm8_cfg(PWM5_FLAG);
      machine_store.pwm5_duty = machine.pwm5_duty;
    }
    else if(machine_store.pwm6_duty != machine.pwm6_duty) {
      set_pwm8_cfg(PWM6_FLAG);
      machine_store.pwm6_duty = machine.pwm6_duty;
    }
    else if(machine_store.pwm7_duty != machine.pwm7_duty) {
      set_pwm8_cfg(PWM7_FLAG);
      machine_store.pwm7_duty = machine.pwm7_duty;
    }
    else if(machine_store.pwm8_duty != machine.pwm8_duty) {
      set_pwm8_cfg(PWM8_FLAG);
      machine_store.pwm8_duty = machine.pwm8_duty;
    }
    osDelay(1);
  }
  /* USER CODE END pwm8 */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */

